#include <bits/stdc++.h>
#include <set>
using namespace std;
set<int> Test_set = {1, 2, 9, 3, 4, 5, 7};
int tmp, n;
int main()
{
    //STL模板
    //set示例,一小部分
    //insert()部分
    //函数insert()会返回一个pair<iterator,bool>类型的值
    //pair.first是一个迭代器,它在成功插入时,指向成功插入后的元素在set里的位置
    //在不成功插入时,这个迭代器指向在set里,与欲插入元素相等的那个元素的地址
    //不论何时,*pair.first=tmp(即欲插入元素)
    //但是地址可能不同
    //pr.second是一个bool类型的变量,在成功插入时=true,不成功时=false
    //利用这个变量可以判断自己要插入的元素是否成功插入了
    //同时,因为set自带判重,利用这个变量也可以做到确定某个元素是否在set内
    cout << "输入欲插入元素:";
    cin >> tmp;
    auto pr = Test_set.insert(tmp);            //auto指自动类型,赋给它的值是什么类型就是什么类型
    cout << "pr.first->" << *pr.first << endl; //pr.first指向的地址永远存着欲插入数
    if (pr.second)                             //pr.second可以判断是否成功插入
    {
        cout << "pr.second=true" << endl
             << "所输入的数 " << tmp << " 在set中不存在,并成功插入" << endl;
    }
    else
    {
        cout << "pr.second=false" << endl
             << "所输入的数 " << tmp << " 在set中存在,无法插入" << endl;
    }
    //find()部分
    //find(T)将会返回一个迭代器
    //在查找值存在时,这个迭代器指向找到的值
    //在查找值不存在时,这个迭代器指向结束迭代器
    cout << "输入想要插入查找的值:";
    cin >> tmp;
    auto iter = Test_set.find(tmp);
    if (*iter == *Test_set.end())
        cout << "所输入的数 " << tmp << " 在set中不存在,最后一个数是 " << *iter << endl;
    else
        cout << "所输入的数 " << tmp << " 在set中存在,位置是iter" << endl;
    //begin()&end()部分
    //这两个函数都返回迭代器
    //begin()返回一个指向set第一个元素的迭代器
    //end()返回一个指向set最后一个元素的后一个位置的迭代器
    //搭配循环可以做到遍历所有元素
    //支持++,--操作
    cout << "以下是begin()&end()相关";
    cout << endl;
    cout << "*begin()=" << *Test_set.begin() << ' ' << "*end()=" << *Test_set.end() << endl;
    auto _iter = Test_set.begin();
    auto __iter = Test_set.end();
    advance(_iter, 3); //这个函数可以做到让指定的迭代器后移指定的位数,此处是将_iter后移3位
    cout << "begin()后移3位的数:" << *_iter << ' ' << "end()上的数:" << *__iter << endl;
    cout << "目前set内元素有:" << endl;
    for (auto iter1 = Test_set.begin(); iter1 != Test_set.end(); iter1++)
        cout << *iter1 << ' ';
    cout << endl;
    //emplace()部分
    //类似于insert(),返回一个pair<iterator,bool>类型的值
    //first指向插入位置
    //second表示是否成功插入
    cout << "输入想要用emplace()插入的数:";
    cin >> tmp;
    auto pr2 = Test_set.emplace(tmp);
    cout << *pr2.first << endl;
    if (pr2.second)
        cout << "成功插入" << endl;
    else
        cout << "未成功插入" << endl;
    //emplace_hint()部分
    //类似于insert()&emplace(),但只返回迭代器
    //可以通过迭代器来指定一个可能的插入位置
    int tmpp;
    cout << "输入想要用emplace_hint()插入的数:";
    cin >> tmp;
    cout << "输入想要插到第几位:";
    cin >> tmpp;
    auto iter3 = Test_set.begin();
    advance(iter3, tmpp);
    auto iter2 = Test_set.emplace_hint(iter3, tmp);
    cout << "插入的数是:" << *iter2 << ' ' << "指定位置的数是:" << *iter3 << endl; //此处输出的两个数可能不一样
    cout << "目前set内元素有:" << endl;
    for (auto iter1 = Test_set.begin(); iter1 != Test_set.end(); iter1++)
        cout << *iter1 << ' ';
    cout << endl;
    //clear()&erase()部分
    //clear()函数会移除set中的所有元素
    //erase()函数会移除迭代器指定的元素,或是与对象匹配的元素
    cout << "输入用erase()的对象匹配删除的数:";
    cin >> tmp;
    cout << "输入用erase()的迭代器删除的数:";
    cin >> tmpp;
    auto iter4 = Test_set.find(tmpp);
    //此处的先后不会影响结果
    //STL有自动调整功能
    Test_set.erase(tmp);
    Test_set.erase(iter4);
    cout << "目前set内元素有:" << endl;
    for (auto iter1 = Test_set.begin(); iter1 != Test_set.end(); iter1++)
        cout << *iter1 << ' ';
    cout << endl;
    Test_set.clear();
    cout << "已执行clear()函数" << endl;
    cout << "目前set内元素有:" << endl;
    for (auto iter1 = Test_set.begin(); iter1 != Test_set.end(); iter1++)
        cout << *iter1 << ' ';
    return 0;
}